// 内存布局

// qemu中UART的寄存器映射的物理地址
#define UART0        0x10000000L
// qemu中VirtIO的寄存器映射的物理地址
#define VIRTIO0      0X10001000L
// qemu 中 platform-level interrupt controller(PLIC) 的物理地址
#define PLIC         0xC0000000L
// 定义 KERNBASE - PHYSTOP 之间的128MB物理内存作为RAM为内核和用户分配页面
#define KERNBASE     0X80000000L
#define PHYSTOP      (KERNBASE + 128 * 1024 * 1024)
// 将trampoline页映射到最高的一页
// trampoline页是一个跳板页，用于保存相关寄存器，实现内核与用户空间的安全切换
// 在每个页表中都具有相同的虚拟地址，并映射到相同的物理地址，作为共享的切换缓冲区
#define TRAMPOLINE   (MAXVA - PGSIZE)
// 将TRAPFRAME虚拟地址设置到trampoline下的一页
// TRAPFRAME与进程的trampoline映射，其中存储用户空间和内核空间切换时的寄存器
#define TRAPFRAME    (TRAMPOLINE - PGSIZE)
// 将内核栈虚拟地址设置到trapframe页下边
// 为每个进程分配两个页，一个作为内核栈，一个用于栈之间的保护，避免栈溢出影响到另一个进程
#define KSTACK(p)    (TRAMPOLINE - ((p) + 1) * 2 * PGSIZE)
